ci: narrow the GPU serve matrix with a serve paths-filter (EAI-7746) - #156
Conversation
|
Automated review pass over the diff against Findings1. 2. 3. 4. 5. 6. Also cross-PR: the Verified clean
Not verified
Nice change overall: the filter comments explain the reasoning rather than just the rule, and the new unit tests cover canary-on/canary-off for both |
d7896c6 to
ffbbc03
Compare
|
Thanks for the thorough pass. Addressed in
Deferred, with reasoning:
The two test-plan boxes (every required GPU check produced; scoped dispatch confirming the canary serves only the one scenario) are validated by the CI run on this push. |
|
Re-review of One blocker, and it is cross-PR rather than internal to this change. Blocking: this PR and #157 make opposite decisions about the same scenarioBoth add a 6th positional
If both land, 6b carries both tags. #157's merge_queue check sits before the canary check in Worth settling on one mechanism before either merges. #157's per-engine pair is strictly better coverage — vLLM and lemonade each get a real per-PR smoke, where a single canary only exercises whichever engine is the platform default. If this one lands first, #157 becomes a retag delta. That also disposes of prior finding 6: one flag instead of three trailing bools. Non-blocking
Tradeoff worth putting in the descriptionThe body says "the full matrix runs in the merge queue", which reads as a backstop; the Checked and clean
The Nice touches: the filter comments explain the reasoning rather than restating the rule, including why root-only |
ffbbc03 to
4cf98e6
Compare
juhovainio
left a comment
There was a problem hiding this comment.
I reviewed the full PR across all three commits. The last commit (dropping the canary mechanism) introduced one real bug, left as inline comments on both affected jobs — missing parentheses cause an operator-precedence issue in the if: conditions for the Strix GPU jobs. Because GitHub Actions binds && tighter than ||, the build/serve checks end up getting skipped entirely on merge_group events, which isn't what the comment right above the block says is supposed to happen. Aside from that, the canary-mechanism removal in this commit looks like a clean revert — no stray references left behind.
… (EAI-7746) The self-hosted GPU E2E lanes (moved to e2e-selfhosted.yml by the EAI-7548 workflow split) gate on the coarse `heavy` paths-filter, which trips on any `**/*.rs` change. So a Rust PR that cannot affect serving (dashboard-only, unrelated crates) still fires the whole real-GPU serve matrix on scarce serial hardware. - Add a dedicated `serve` paths-filter to e2e-selfhosted.yml's `changes` job: a serve-relevant allowlist (engines, the serve code path in apps/rocm and apps/rocmd, rocm-core, rocm-engine-protocol, the e2e-cucumber harness and e2e-report, xtask, feature files) plus broad-dependency safety nets (root Cargo.toml, Cargo.lock, rust-toolchain, workflow files). Excludes the rocm-dash-* crates, whose compile coverage stays on ci.yml's always-on build/test lanes. Forced true off pull_request so the merge queue always runs the full matrix. - Repoint the three GPU jobs and the consolidated-report gate from `heavy` to `serve`, so a non-serve Rust PR skips the matrix. - Update docs/ci-hardware-testing.md to describe the `serve` gate. Signed-off-by: fredespi <fredrik.espinoza@gmail.com>
4cf98e6 to
5933b1a
Compare
|
Thanks @juhovainio — you're right about the operator-precedence bug in the Strix That gating lived in
Net diff is now just |
juhovainio
left a comment
There was a problem hiding this comment.
Review
Looked at the actual diff (e2e-selfhosted.yml + docs/ci-hardware-testing.md, +52/-11) against the PR description.
Description/diff mismatch: The description describes Strix lanes moving to merge_group/push-only with skip-on-PR, an MI300X E2E_PR_CANARY mode serving a single scenario per PR, @canary/@serves-on-gpu harness tags, and a report gate of heavy || serve. None of that is in this diff — the actual change only adds a serve paths-filter and repoints the 3 GPU jobs + report job's if from needs.changes.outputs.heavy to needs.changes.outputs.serve (plain serve, not heavy || serve).
As it stands, this PR doesn't reduce GPU-hardware load the way the description claims — a serve-matching PR still runs the full 3-lane GPU matrix on pull_request, not a canary. Two Test Plan checkboxes ("canary path serves only the single scenario") describe behavior that isn't implemented here.
Could you clarify whether the description needs to be trimmed to match what's actually shipped, or whether commits implementing the canary/merge_group-gating work are missing from this PR?
Separately, I checked the two things most likely to be wrong in a paths-filter narrowing and both look correct:
- Excluding
crates/rocm-dash-*from theservefilter is sound — those crates are only reachable fromapps/rocm/src/dash.rs(the separatedashsubcommand), not from anything in the serve path. - Scoping to
Cargo.tomlrather than**/Cargo.tomlis correct and matches the stated reasoning (catches root[workspace.dependencies]edits without re-including the excluded dash crates' own manifests).
|
Thanks — you read it right, and the answer is "trim the description": no commits are missing. The canary / merge-queue-gating work was deliberately dropped from this PR. It collided with #157, which tags the same scenario ( The description has now been updated to describe only what actually ships here, and the two stale Test Plan checkboxes are gone. On the report gate: plain And thanks for double-checking the |
Summary
The three self-hosted GPU E2E jobs (
e2e-gpu,e2e-gpu-strix-ubuntu,e2e-gpu-strix-windows) were gated on the coarseheavypaths-filter, which trips on any**/*.rschange. So a Rust PR that cannot affect serving — a dashboard-only change, or an unrelated crate — fired the whole real-GPU serve matrix on scarce, serial hardware.This adds a narrower
servefilter and points the GPU jobs at it, so those PRs skip the matrix. Scope is limited toe2e-selfhosted.ymlplus its documentation; no harness or test code changes.Changes
servepaths-filter in the workflow'schangesjob. It matches only paths that can change serve behaviour or the GPU E2E harness:engines/**,crates/rocm-core/**,crates/rocm-engine-protocol/**,apps/rocm/**,apps/rocmd/**,tests/e2e-cucumber/**,crates/e2e-report/**,xtask/**,**/*.feature, andscripts/**, plus broad-dependency safety nets (rootCargo.toml,Cargo.lock,rust-toolchain*,.github/workflows/**).crates/rocm-dash-*crates. They build into therocmbinary but cannot change serve behaviour, and their compile coverage already runs onci.yml's always-on build/test lanes — excluding them is what lets a dash-only PR skip the GPU matrix.**/Cargo.toml. A blanket manifest glob would re-include the excluded dash crates; the root manifest is still matched because[workspace.dependencies]edits can change a serving crate's dependencies without touchingCargo.lock.serveinstead ofheavy. The report also still runs onworkflow_dispatch, whereserveis unset.serveis forcedtrueoffpull_request, sopushandmerge_groupalways run the full matrix.docs/ci-hardware-testing.mdnow describes theservegate instead ofheavy, including the manual-dispatch path.Test plan
tar, which is green on GitHub CI).cargo test -p xtask workflow_contractpasses 5/5.servegates exactly the three GPU jobs plus the consolidated report, andheavystill gates the mock/build/test lanes.ci.yml's always-on mock lane, and theinstall*/docs/keyspaths are only exercised by lifecycle scenarios, which the GPU lanes never ran.Refs EAI-7746.